package clases.busquedalocal;

import interfaces.HeuristicaBusquedaLocal;
import java.io.IOException;
import java.util.ArrayList;

import clases.CasoDePrueba;
import clases.Helper;
import clases.ResultadoCasoDePruebaArrayBinarios;
import clases.Tupla;

public class BusquedaLocalTresVariables implements HeuristicaBusquedaLocal{

	static ArrayList<CasoDePrueba> casosDePrueba = new ArrayList<CasoDePrueba>();

	public void doit() throws IOException {
		Helper.leerArchivoBusquedaLocal(this, "TP3_BusquedaLocal3Variables.out");
	}

	public ResultadoCasoDePruebaArrayBinarios dameLaSolucionDelCaso(CasoDePrueba caso, ResultadoCasoDePruebaArrayBinarios constructiva) {

		int[][] matrizClausulas = Helper.llenarPositivosYNegativosMatriz(caso.clausulas, caso.clausulas.size(), constructiva.binarioQueHaceMaxLasClausulas.length);
		int[] contadorVariablesEnTrueMax = Helper.contarValoresVerdaderos(matrizClausulas, constructiva.binarioQueHaceMaxLasClausulas, constructiva.binarioQueHaceMaxLasClausulas.length);

		ResultadoCasoDePruebaArrayBinarios solucionMax = constructiva;

		int[] solucionBusquedaLocal = solucionMax.binarioQueHaceMaxLasClausulas.clone();

		Tupla solucionesNuevas = new Tupla();
		
		boolean hiceVerdaderasTodasLasClausulas = false;
		
		boolean resetieContadores = false;
		
		int k = 0;
		
		for (int i = 0; i < solucionBusquedaLocal.length && !hiceVerdaderasTodasLasClausulas; i++) {

			for (int j = 0; j < solucionBusquedaLocal.length && !hiceVerdaderasTodasLasClausulas; j++) {
				k = 0;
				while( (k < solucionBusquedaLocal.length) && !(hiceVerdaderasTodasLasClausulas) ) {

					solucionesNuevas = Helper.chequear(solucionMax, i, j, k, caso, contadorVariablesEnTrueMax, matrizClausulas);

					if (solucionesNuevas.clausulasSatisfechas > solucionMax.clausulasMax) {
						solucionMax.clausulasMax = solucionesNuevas.clausulasSatisfechas;
						solucionMax.binarioQueHaceMaxLasClausulas = solucionesNuevas.binarion;
						solucionMax.listaClausulasSatisfechas = solucionesNuevas.listaClausulas;
						contadorVariablesEnTrueMax = solucionesNuevas.contadorVariablesEnTrue.clone();
						i = 0;
						j = 0;
						k = 0;
						resetieContadores = true;
						
						if (caso.c == solucionMax.clausulasMax) {
							hiceVerdaderasTodasLasClausulas = true;
						}
					}
					
					if(!resetieContadores) {
						k++;
					}
					
					resetieContadores = false;
				}
			}
		}
		return solucionMax;
	}
}
